import baseUrl from '@/config/request.config'
import {
    getToken,
    setToken
} from '@/utils/auth'
import {
    useUserStore
} from '@/store/modules/user'
import {
    toast,
    showConfirm,
    tansParams
} from '@/utils/common'

import type { uniReqConfig, uniRequestRes } from '@/types'

let timeout = 20000

interface failRequestRes extends GeneralCallbackResult {
    success: boolean,
    data: any,
    code: number
}

console.log("----->请求路径------->",baseUrl);


const request = (config: uniReqConfig): Promise<uniRequestRes | failRequestRes> => {
    // 是否需要设置 token
    const isToken = (config.headers || {}).isToken === false
    config.header = config.header || {}
    if (getToken() && !isToken) {
        config.header['Authorization'] = 'Bearer ' + getToken()
    }
    // get请求映射params参数
    if (config.params) {
        let url = config.url + '?' + tansParams(config.params)
        url = url.slice(0, -1)
        config.url = url
    }
    return new Promise((resolve, reject) => {
        uni.request({
            method: config.method || 'get',
            timeout: config.timeout || timeout,
            url: config.baseUrl || baseUrl + config.url,
            data: config.data,
            header: config.header,
            dataType: 'json',
            success: (res: UniApp.RequestSuccessCallbackResult) => {
                if (res.header.Authorization) {
                    useUserStore().SET_TOKEN(res.header.Authorization)
                    setToken(res.header.Authorization)
                }
                let data = res.data as uniRequestRes
                const code = data.code || 200
                const msg = data.msg || data.message || ''
                if (code === 1403 || code === 401) {
                    let store = useUserStore()
                    showConfirm('登录状态已过期，您可以继续留在该页面，或者重新登录?').then((res: any) => {
                        if (res.confirm) {
                            store.LOGOUT()
                            uni.reLaunch({
                                url: '/pages/selectRole'
                            })
                        }
                    })
                } else if (code !== 200) {
                    toast(msg)
                }
                resolve(data)
            },
            fail: (err) => {
                let { errMsg }: { errMsg?: string } = err
                if (!errMsg) {
                    errMsg = '未知错误'
                }
                if (errMsg === 'Network Error') {
                    errMsg = '后端接口连接异常'
                } else if (errMsg.includes('timeout')) {
                    errMsg = '系统接口请求超时'
                } else if (errMsg.includes('Request failed with status code')) {
                    errMsg = '系统接口' + errMsg.substr(errMsg.length - 3) + '异常'
                }
                toast(errMsg)
                resolve({
                    ...err,
                    success: false,
                    data: null,
                    code: 500
                })
            }
        })
    })
}

export default request